/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package camada.bancodedados.daoimplemente.financeiro.cheque;

import camada.bancodedados.conexao.Conexao;
import camada.bancodedados.daoimplemente.banco.BancoDAOImpl;
import camada.bancodedados.daoimplemente.cliente.PessoaFisicaDAOImpl;
import camada.bancodedados.daoimplemente.fornecedor.FornecedorDAOImpl;
import camada.negocio.dao.financeiro.cheque.ChequeRecebimentoDAO;
import eloma.classe.Cliente;
import eloma.classe.Fornecedor;
import eloma.classe.banco.Banco;
import eloma.classe.cheque.ChequeRecebimento;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Icaro
 */
public class ChequeRecebimentoDAOImpl implements ChequeRecebimentoDAO {

    private static Connection con;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    @Override
    public void inserir(ChequeRecebimento l) throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            final String SQL_SCRIPT = "INSERT INTO cheque_recebimento(dataCadastro,idBanco,dataParaBaixa,numeroCheque,nomeEmitente,idCliente,"
                    + "valorCheque,CMC7,dataDeposito,compensado,dataRepasse,nomeDestinatario,idFornecedor,dataDevolucao)"
                    + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?);";

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setDate(1, l.getDataCadastro());
            stmt.setInt(2, l.getBanco().getIdBanco());
            stmt.setDate(3, l.getDataParaBaixa());
            stmt.setString(4, l.getNumeroCheque());
            stmt.setString(5, l.getNomeEmitente());
            stmt.setInt(6, l.getCliente().getIdCliente());
            stmt.setDouble(7, l.getValor());
            stmt.setString(8, l.getCMC7());
            stmt.setDate(9, l.getDataDeposito());
            if (l.isCompensado() == true) {
                stmt.setString(10, "S");
            } else if (l.isCompensado() == false) {
                stmt.setString(10, "N");
            }
            stmt.setDate(11, l.getDataRepasse());
            stmt.setString(12, l.getNomeDestinatario());
            stmt.setInt(13, l.getFornecedor().getIdFornecedor());
            stmt.setDate(14, l.getDataDevolucao());

            stmt.executeUpdate();

            con.commit();

        } catch (SQLException e) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }
    }

    @Override
    public ChequeRecebimento buscaId(int id) throws Exception {

        try {

            final String SQL_SCRIPT = "select * from cheque_recebimento where idChequeRecebimento = ?";

            con = Conexao.getCon();
            con.setAutoCommit(false);

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setInt(1, id);
            rs = stmt.executeQuery();

            con.commit();

        } catch (SQLException sqle) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

        return carregarResultadoSimples(rs);
    }

    @Override
    public void atualizar(ChequeRecebimento l) throws Exception {

        try {

            final String SQL_SCRIPT = "UPDATE cheque_recebimento SET dataCadastro = ?,idBanco = ?,dataParaBaixa = ?,"
                    + "numeroCheque = ?,nomeEmitente = ?,idCliente = ?, valorCheque = ?, CMC7 = ?,dataDeposito = ?,compensado = ?,"
                    + "dataRepasse = ?,nomeDestinatario = ?,idFornecedor = ?,dataDevolucao = ? WHERE idChequeRecebimento = ?";

            con = Conexao.getCon();
            con.setAutoCommit(false);

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setDate(1, l.getDataCadastro());
            stmt.setInt(2, l.getBanco().getIdBanco());
            stmt.setDate(3, l.getDataParaBaixa());
            stmt.setString(4, l.getNumeroCheque());
            stmt.setString(5, l.getNomeEmitente());
            stmt.setInt(6, l.getCliente().getIdCliente());
            stmt.setDouble(7, l.getValor());
            stmt.setString(8, l.getCMC7());
            stmt.setDate(9, l.getDataDeposito());
            if (l.isCompensado() == true) {
                stmt.setString(10, "S");
            } else if (l.isCompensado() == false) {
                stmt.setString(10, "N");
            }
            stmt.setDate(11, l.getDataRepasse());
            stmt.setString(12, l.getNomeDestinatario());
            stmt.setInt(13, l.getFornecedor().getIdFornecedor());
            stmt.setDate(14, l.getDataDevolucao());
            stmt.setInt(15, l.getIdChequeRecebimento());

            stmt.executeUpdate();

            con.commit();

        } catch (SQLException e) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }
    }

    @Override
    public void remover(ChequeRecebimento l) throws Exception {

        try {

            final String SQL_SCRIPT = "delete from cheque_recebimento where idChequeRecebimento = ?";

            con = Conexao.getCon();
            con.setAutoCommit(false);

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setInt(1, l.getIdChequeRecebimento());
            stmt.executeUpdate();

            con.commit();

        } catch (SQLException e) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

    }

    @Override
    public List<ChequeRecebimento> buscaTodos() throws Exception {

        try {

            String SQL_SCRIPT = "Select * from cheque_recebimento order by idChequeRecebimento";

            con = Conexao.getCon();
            con.setAutoCommit(false);

            stmt = con.prepareStatement(SQL_SCRIPT);
            rs = stmt.executeQuery();

            con.commit();

        } catch (SQLException sqle) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

        return carregarMultiplosResultados(rs);

    }

    public List<ChequeRecebimento> carregarMultiplosResultados(ResultSet rs) throws SQLException {
        List<ChequeRecebimento> resultList = new ArrayList<ChequeRecebimento>();
        while (rs.next()) {
            ChequeRecebimento dto = new ChequeRecebimento();
            carregarVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }

    private ChequeRecebimento carregarResultadoSimples(ResultSet rs) throws SQLException {
        if (rs.next()) {
            ChequeRecebimento dto = new ChequeRecebimento();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }
    }

    private void carregarVO(ChequeRecebimento dto, ResultSet rs) throws SQLException {
        try {

            BancoDAOImpl daoBanco = new BancoDAOImpl();
            PessoaFisicaDAOImpl daoCliente = new PessoaFisicaDAOImpl();
            FornecedorDAOImpl daoFornecedor = new FornecedorDAOImpl();

            dto.setIdChequeRecebimento(rs.getInt("idChequeRecebimento"));
            dto.setDataCadastro(rs.getDate("dataCadastro"));

            Banco b = daoBanco.buscaBancoId(rs.getInt("idBanco"));
            dto.setBanco(b);

            dto.setDataParaBaixa(rs.getDate("dataParaBaixa"));
            dto.setNumeroCheque(rs.getString("NumeroCheque"));
            dto.setNomeEmitente(rs.getString("NomeEmitente"));

            Cliente c = daoCliente.buscaId(rs.getInt("idCliente"));
            dto.setCliente(c);

            dto.setValor(rs.getDouble("ValorCheque"));
            
            dto.setCMC7(rs.getString("CMC7"));
            dto.setDataDeposito(rs.getDate("dataDeposito"));

            if ("S".equals(rs.getString("compensado"))) {
                dto.setCompensado(true);
            } else if (rs.getString("compensado") == "N") {
                dto.setCompensado(false);
            }

            dto.setDataRepasse(rs.getDate("DataRepasse"));
            dto.setNomeDestinatario(rs.getString("NomeDestinatario"));

//            Fornecedor f = daoFornecedor.buscaId(rs.getInt("idFornecedor"));
//            dto.setFornecedor(f);
            dto.setDataDevolucao(rs.getDate("DataDevolucao"));

        } catch (Exception e) {

        }
    }

}
